home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 54813 / 54813.xpi / chrome / content / add2cal.js~ < prev    next >
Text File  |  2009-12-14  |  33KB  |  378 lines

  1. HTML = "http://www.w3.org/1999/xhtml"
  2.  
  3. var add2cal_location_listener =
  4. {
  5.     QueryInterface: function (aIID)
  6.     {
  7.         if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
  8.             aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
  9.             aIID.equals(Components.interfaces.nsISupports))
  10.         {
  11.             return this
  12.         }
  13.         throw Components.results.NS_NOINTERFACE
  14.     },
  15.     
  16.     onLocationChange: function (aProgress, aRequest, aURI)
  17.     {
  18.         add2cal.handle_new_url(aProgress.DOMWindow)
  19.     },
  20.     
  21.     onStateChange: function (a, b, c, d) {},
  22.     onProgressChange: function (a, b, c, d, e, f) {},
  23.     onStatusChange: function (a, b, c, d) {},
  24.     onSecurityChange: function (a, b, c) {}
  25. };
  26.  
  27.  
  28. var add2cal = 
  29. {
  30.     cache: {},
  31.     
  32.     hidden_alert_by_tab: {},
  33.     
  34.     showing: false,
  35.     
  36.     BASE_URL: 'http://add2cal.blackdrumm.com',
  37.     
  38.     init: function ()
  39.     {
  40.         add2cal.log_action({
  41.             action: 'extension-load'
  42.         })
  43.         
  44.         gBrowser.addProgressListener(
  45.             add2cal_location_listener,
  46.             Components.interfaces.nsIWebProgress.NOTIFY_LOCATION
  47.         )
  48.         
  49.         add2cal.popup = document.getElementById('add2cal-popup')
  50.         add2cal.alert = document.getElementById('add2cal-alert')
  51.         add2cal.button = document.getElementById('add2cal-button')
  52.         
  53.         document.getElementById('add2cal-close-popup').addEventListener('click', function ()
  54.         {
  55.             add2cal.close_alert(true)
  56.             add2cal.log_action({
  57.                 action: 'alert-hide',
  58.                 source: 'alert-button',
  59.                 url: content.location.href
  60.             })
  61.         }, false)
  62.         
  63.         add2cal.button.addEventListener('click', function ()
  64.         {
  65.             if (add2cal.showing)
  66.             {
  67.                 add2cal.close_alert(true)
  68.             }
  69.             
  70.             var sel = content.window.getSelection()
  71.             
  72.             if (sel.toString())
  73.             {
  74.                 add2cal.load_bookmarklet()
  75.                 
  76.                 add2cal.log_action({
  77.                     action: 'bookmarklet-load',
  78.                     source: 'toolbar-button',
  79.                     url: content.location.href,
  80.                     selection: sel.toString()
  81.                 })
  82.             }
  83.             else
  84.             {
  85.                 add2cal.load_bookmarklet()
  86.                 
  87.                 add2cal.log_action({
  88.                     action: 'bookmarklet-load',
  89.                     source: 'toolbar-button',
  90.                     url: content.location.href
  91.                 })
  92.             }
  93.         }, false)
  94.     },
  95.     
  96.     uninit: function ()
  97.     {
  98.         gBrowser.removeProgressListener(add2cal_location_listener);
  99.     },
  100.     
  101.     close_alert: function (keep_active)
  102.     {
  103.         if (!add2cal.showing)
  104.         {
  105.             return
  106.         }
  107.         
  108.         add2cal.popup.hidePopup()
  109.         
  110.         if (keep_active)
  111.         {
  112.             if (typeof add2cal.hidden_alert_by_tab[content.location.href] == 'undefined')
  113.             {
  114.                 add2cal.hidden_alert_by_tab[content.location.href] = true
  115.                 content.addEventListener('unload', (function(url)
  116.                 {
  117.                     return function ()
  118.                     {
  119.                         delete add2cal.hidden_alert_by_tab[url]
  120.                     }
  121.                 })(content.location.href), false)
  122.             }
  123.         }
  124.         else
  125.         {
  126.             add2cal.button.setAttribute('image', 'chrome://add2cal/skin/icon.png')
  127.         }
  128.         
  129.         add2cal.showing = false
  130.     },
  131.     
  132.     show_alert: function (from_button_click, is_quiet)
  133.     {
  134.         add2cal.button.setAttribute('image', 'chrome://add2cal/skin/icon_active.png')
  135.         
  136.         if ((
  137.             add2cal.hidden_alert_by_tab[content.location.href] || is_quiet) && !from_button_click)
  138.         {
  139.             return
  140.         }
  141.         
  142.         add2cal.log_action({
  143.             action: 'alert-show',
  144.             url: content.location.href
  145.         })
  146.         
  147.         add2cal.popup.openPopup(add2cal.button, "after_end", 20, 0, false, false)
  148.         add2cal.showing = true
  149.         
  150.         setTimeout(function ()
  151.         {
  152.             add2cal.close_alert(true)
  153.         }, 5000)
  154.     },
  155.     
  156.     handle_new_url: function (win, from_button_click)
  157.     {
  158.         add2cal.close_alert()
  159.         
  160.         var cached = add2cal.cache[win.location.href]
  161.         
  162.         if (typeof cached != "undefined")
  163.         {
  164.             if (cached == null)
  165.             {
  166.                 if (from_button_click)
  167.                 {
  168.                     add2cal.load_bookmarklet()
  169.                     add2cal.log_action({
  170.                         action: 'bookmarklet-load',
  171.                         source: 'toolbar-button',
  172.                         url: content.location.href
  173.                     })
  174.                 }
  175.                 return
  176.             }
  177.             
  178.             add2cal.handle_hit(cached[0], cached[1], win, from_button_click)
  179.             return
  180.         }
  181.         
  182.         var scraper = null
  183.         
  184.         for (n in scrapers)
  185.         {
  186.             var s = scrapers[n]
  187.             
  188.             if (win.location.href.match(s))
  189.             {
  190.                 scraper = n
  191.                 break
  192.             }
  193.         }
  194.         
  195.         if (scraper)
  196.         {
  197.             add2cal.cache[win.location.href] = [null, true]
  198.             add2cal.handle_hit(null, true, win, from_button_click, quiet_scrapers.indexOf(scraper) != -1)
  199.             return
  200.         }
  201.         
  202.         var parts
  203.         
  204.         try
  205.         {
  206.             parts = win.location.host.split('.')
  207.         }
  208.         catch (e)
  209.         {
  210.             if (from_button_click)
  211.             {
  212.                 add2cal.load_bookmarklet()
  213.                 add2cal.log_action({
  214.                     action: 'bookmarklet-load',
  215.                     source: 'toolbar-button',
  216.                     url: content.location.href
  217.                 })
  218.             }
  219.             return
  220.         }
  221.         
  222.         if (parts.length == 2)
  223.         {
  224.             parts.unshift('www')
  225.         }
  226.         
  227.         var domain = parts.join('.')
  228.         
  229.         if (-1 < domains.indexOf(domain))
  230.         {
  231.             var req = new XMLHttpRequest()
  232.             req.open('GET', add2cal.BASE_URL+'/entities_by_url?url='+encodeURIComponent(win.location.href), true)
  233.             req.onreadystatechange = function (e)
  234.             {
  235.                 if (req.readyState == 4)
  236.                 {
  237.                     var result = JSON.parse(req.responseText)
  238.                     
  239.                     if (result.events || result.venues)
  240.                     {
  241.                         add2cal.cache[win.location.href] = [result, false]
  242.                         add2cal.handle_hit(result, false, win, from_button_click)
  243.                     }
  244.                     else
  245.                     {
  246.                         add2cal.cache[win.location.href] = null
  247.                         if (from_button_click)
  248.                         {
  249.                             add2cal.load_bookmarklet()
  250.                         }
  251.                     }
  252.                 }
  253.             }
  254.             req.send(null)
  255.         }
  256.         else
  257.         {
  258.             add2cal.cache[win.location.href] = null
  259.             
  260.             if (from_button_click)
  261.             {
  262.                 add2cal.load_bookmarklet()
  263.             }
  264.         }
  265.     },
  266.     
  267.     handle_hit: function (entities, scraper, win, from_button_click, is_quiet)
  268.     {
  269.         if (win.content.document.getElementById('add2cal'))
  270.         {
  271.             return
  272.         }
  273.         
  274.         if (add2cal.alert.hasChildNodes())
  275.         {
  276.             while (add2cal.alert.childNodes.length > 0)
  277.             {
  278.                 add2cal.alert.removeChild(add2cal.alert.firstChild)
  279.             }
  280.         }
  281.         
  282.         var info = ''
  283.         
  284.         if (scraper || entities && entities.events)
  285.         {
  286.             info = 'We found upcoming events on this page.'
  287.         }
  288.         else if (entities && entities.venues)
  289.         {
  290.             info = 'Creating an event for this venue?'
  291.         }
  292.         else
  293.         {
  294.             return
  295.         }
  296.         
  297.         add2cal.alert.appendChild(document.createTextNode(info+' '))
  298.         add2cal.alert.appendChild(document.createElementNS(HTML, 'br'))
  299.         
  300.         var link = document.createElementNS(HTML, 'a')
  301.         link.setAttribute('href', '#')
  302.         link.appendChild(document.createTextNode('add.2.cal ┬╗'))
  303.         add2cal.alert.appendChild(link)
  304.         
  305.         add2cal.alert.style.display = 'block'
  306.         
  307.         link.addEventListener('click', function ()
  308.         {
  309.             add2cal.close_alert(true)
  310.             add2cal.load_bookmarklet()
  311.             
  312.             add2cal.log_action({
  313.                 action: 'bookmarklet-load',
  314.                 source: 'alert',
  315.                 url: content.location.href
  316.             })
  317.         }, false)
  318.         
  319.         add2cal.show_alert(from_button_click, is_quiet)
  320.     },
  321.     
  322.     load_bookmarklet: function ()
  323.     {
  324.         var doc = content.document
  325.         var head = doc.getElementsByTagName('head')[0]
  326.         var script = doc.createElement('script')
  327.         script.type = 'text/javascript'
  328.         script.src = add2cal.BASE_URL+'/bookmarklet/load?t='+(new Date().getTime())
  329.         head.appendChild(script)
  330.     },
  331.     
  332.     log_action: function (details)
  333.     {
  334.         details['area'] = 'firefox-addon'
  335.         
  336.         var pairs = []
  337.         
  338.         for (n in details)
  339.         {
  340.             var encoded_n = encodeURIComponent(n)
  341.             
  342.             if (details[n].constructor == Array)
  343.             {
  344.                 details[n].forEach(function (v)
  345.                 {
  346.                     pairs.push(encoded_n+'='+encodeURIComponent(v))
  347.                 })
  348.             }
  349.             else
  350.             {
  351.                 pairs.push(encoded_n+'='+encodeURIComponent(details[n]))
  352.             }
  353.         }
  354.         
  355.         var data = pairs.join('&')
  356.         
  357.         var req = new XMLHttpRequest()
  358.         req.open('POST', add2cal.BASE_URL+'/actions/log', true)
  359.         req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
  360.         req.setRequestHeader('Content-Length', data.length)
  361.         req.send(data)
  362.     }
  363. }
  364.  
  365. window.addEventListener("load", function() { add2cal.init() }, false);
  366. window.addEventListener("unload", function() { add2cal.uninit() }, false);
  367.  
  368.  
  369. var scrapers = {
  370.     facebook: /(facebook\.com\/event\.php[^#]+$)|(facebook\.com(.+)#\/event\.php)/,
  371.     evite: /evite\.com\/pages\/invite\/viewInvite\.jsp/,
  372.     yelp: /yelp\.com\/biz\//
  373. }
  374.  
  375. var quiet_scrapers = ['yelp']
  376.  
  377. var domains = ['scratch.dev.lan','www.chapeausf.com','www.cafebastillesf.com','www.topofthemark.com','www.fishermanswharf.hyatt.com','www.firesidecamera.com','firenzebynight.ypguides.net','www.sanfranciscomerchants.com','www.glaskat.com','www.mezzaninesf.com','www.calacademy.org','www.larkspurhotelunionsquare.com','www.penapachamama.com','www.matrixfillmore.com','www.sfplayhouse.org','www.mandarinoriental.com','www.biasrestaurantandwinebar.com','www.cartoonart.org','www.eossf.com','www.stanfordparkhotel.com','www.chouchousf.com','www.litquake.org','tzsf-tickets.zinzanni.org','www.pasharestaurant.com','www.studioforurbanprojects.org','www.kuletos.com','www.postrio.com','www.waxmuseum.com','www.angelisland.org','portal.sfusd.edu','www.themarsh.org','www.cruisinthecastro.com','www.ftloose.org','www.straitsrestaurants.com','www.labohemerestaurant.com','www.trattoriacontadina.com','www.jazzatpearls.com','www.eastsidewestsf.com','www.townhallsf.com','www.stmarks-sf.org','www.suminthecastro.com','www.tndc.org','www.figaroristorante.com','www.pantareirestaurant.com','www.LarkCreekSteak.com','www.LaCiccia.com','www.a16sf.com','www.gammasf.com','www.ghirardellisq.com','www.sherithisrael.org','www.workspacelimited.org','www.mochicasf.com','www.viognierrestaurant.com','www.exoticeroticball.com','www.thecaprice.com','www.neimanmarcus.com','www.californiapioneers.org','www.bloomingdales.com','www.sfvampiretour.com','www.gcjm.com','www.sfheritage.org','www.architecturesf.com','www.almasrisfca.com','www.trapezerestaurant.com','www.asianart.org','museum.stanford.edu','www.sfballet.org','www.jacksonfillmoresf.com','www.sfmart.com','www.ristorantemataro.com','www.lezinc.com','www.sfcm.edu','www.sfcb.org','www.letrianongallery.com','www.hydestreetbistrosf.com','www.thebuenavista.com','www.blowfishsushi.com','www.ci.sf.ca.us','www.castrostreetfair.org','www.sfartscommission.org','www.henryshunanrestaurant.com','www.aftermodern.com','www.frescasf.com','www.sens-sf.com','www.marinemammalcenter.org','www.ahl-missionbay.com','www.rhodyco.com','www.fandorinrestaurant.com','www.delanceystreetfoundation.org','www.acmechophouse.com','www.sfbc.org','www.guaymasrestaurant.com','www.yanksing.com','www.sfcityguides.org','www.astariasm.com','www.bushi-tei.com','www.therichmondsf.com','www.redvicmoviehouse.com','www.mccormickandschmicks.com','www.bayarea-events.com','www.boxcartheatre.org','www.elraigon.com','www.sflatinofilmfestival.com','www.johnnyfoleys.com','www.boccecafe.com','www.bhnc.org','www.thejugshop.com','www.townsc.com','www.epiphanydance.org','www.croatianamericanweb.org','www.ticketmaster.com','www.sfarmory.com','www.broadwaystudios.com','www.chouquets.com','www.shoppingthemusical.com','www.randallmuseum.org','www.horizonssausalito.com','www.doloresparkcafe.org','www.annabellassanfrancisco.com','www.cityclubsf.com','www.buffaloexchange.com','www.wattis.org','www.taocafe.com','www.pompeisgrottosf.com','www.suppenkuche.com','www.paragonrestaurant.com','www.therootsrestaurant.com','www.sanfranciscovisitor.com','www.sf-local.com','www.sfwmpac.org','www.streetcar.org','www.shanghai1930.com','www.tresagaves.com','www.actorstheatresf.org','www.vesuvio.com','www.terzosf.com','www.carnelianroom.com','www.chezpapasf.com','www.harlotsf.com','www.brava.org','www.ritzcarltondiningroom.com','www.villaromanasf.com','www.sfmoma.org','www.namubar.com','www.cantucciosf.com','www.martinlawrence.com','www.ashoka-sf.com','www.japantownparking.com','www.stompede.com','www.livesushibar.com','www.huntingtonhotel.com','www.moadsf.org','www.chaamthaisf.com','www.yourmusegallery.com','stepout.diabetes.org','www.deep-sf.com','www.hanazenrestaurant.com','www.defyinginequality.com','www.mocfa.org','www.sfmusic.org','www.ginakhan.com','www.rubyskye.com','www.americancyclery.com','www.fairmont.com','www.sfvenues.com','www.ristorantespasso.com','www.maharanirestaurant.com','www.conduitrestaurant.com','www.verdiclub.net','www.westin.com','www.butterflysf.com','www.sresproductions.com','www.mex-df.com','www.creativityexplored.org','www.milanosf.com','www.sffilmcentre.com','www.medjoolsf.com','www.modernthaisf.com','www.rotibistro.com','www.cafetiramisu.com','www.celebrateclitoris.com','www.pinktriangleproject.com','www.lecharm.com','www.sfnpc.org','www.goldengateparkgolf.com','www.bocasf.com','www.restaurantmarche.com','www.uusf.org','www.FishermensGrotto.com','www.bayanihancc.org','www.sfiac.org','www.masonicauditorium.com','www.beachblanketbabylon.com','www.stfyc.com','www.barracudasushi.com','www.lime-sf.com','www.doe-sf.com','www.buckeyeroadhouse.com','www.cherylburkedance.com','www.slanteddoor.com','www.thirstybear.com','www.sfpalm.org','www.kuletostrattoria.com','www.Izzyssteaksandchops.com','www.grandcafe-sf.com','www.roycegallery.com','www.roxie.com','www.emanuelsf.org','www.a3atmosphere.com','www.tannourinecuisine.com','www.thetipsypigsf.com','www.lamarsf.com','www.himmelbergergallery.com','www.sfjazz.org','www.savannajazz.com','www.ramprestaurant.com','www.solsticelounge.com','www.meridiangallery.org','www.ritzcarlton.com','www.tara-restaurant.com','www.kincaids.com','www.sushiran.com','www.kingchacha.com','www.frantoio.com','www.custommade.org','www.azuresancarlos.com','www.btwcsc.org','www.amnesiathebar.com','www.wexlerssf.com','www.fillmorejazzfestival.com','www.townsendrb.com','www.waterbarsf.com','www.ripleysf.com','www.oldfirstconcerts.org','lodi.winecountry.com','www.epicroasthousesf.com','www.jardiniere.com','www.posterfair.com','www.leftatalb.com','www.laiola.com','www.thoreau.org','www.capurros.com','www.greatbuildings.com','www.piacererestaurant.com','www.ghirardelli.com','www.threeseasonsrestaurant.com','www.ristoranterocca.com','www.piazzamarket.com','www.mtbs.com','WWW.RESTAURANTCASSIS.COM','www.cantinasf.com','www.sfzoo.org','www.arionpress.com','www.dancealongnutcracker.org','www.swedishamericanhall.com','www.restaurantanzu.com','www.gamh.com','www.cliffhouse.com','www.dnalounge.com','www.flaxart.com','www.sfhistory.org','www.sffas.org','web.mac.com','www.angelinorestaurant.com','www.ninthstreet.org','www.kaygetsu.com','www.skatebowl.com','www.sfmomos.com','www.anniessocialclub.com','www.outthedoors.com','www.ubayp.com','www.fourseasons.com','www.searsfinefood.com','www.andrewshotel.com','www.festoonsalon.com','www.tajhotels.com','www.blueplatesf.com','www.offmarkettheater.com','www.cavallopoint.com','www.dosasf.com','www.fleetweek.us','www.coyoteptmuseum.org','www.lexingtonclub.com','www.americandreams.com','www.bottomofthehill.com','www.templesf.com','www.perbaccosf.com','www.unicorndining.com','www.globerestaurant.com','www.cobbscomedy.com','www.shrinesf.org','www.sfjazzhotplate.org','www.paliodasti.com','www.circasf.com','www.slowclub.com','www.fogcitydiner.com','www.delessiomarket.com','www.sfautoshow.com','www.charangasf.com','www.thefishmarket.com','www.fmlp.org','www.sahasf.com','www.laprovencesf.com','www.sffs.org','www.eurekatheatre.org','www.audium.org','www.indigorestaurant.com','www.sfdark.com','www.calvarypresbyterian.org','www.brindisicucina.com','www.gourmetwalks.com','www.odcdance.org','www.greenapplebooks.com','www.fior.com','www.fleurdelyssf.com','www.icbbuilding.com','www.rubyliving.com','www.baycitybike.com','www.chsa.org','www.phoenixtheatresf.org','www.sundancecinemas.com','www.streetonpolk.com','www.madpianos.com','www.portolafestival.org','www.chenerypark.com','www.stregis.com','www.venticello.com','www.sfdesigncenter.com','www.michelangelocaffe.com','www.waltdisney.org','www.TheEliteCafe.com','www.rock-it-room.com','www.jones-sf.com','www.counterpulse.org','www.oramv.com','www.broadwaygrill.biz','sf.yoshis.com','www.onelettermandrive.com','www.labelledayspas.com','www.visitfishermanswharf.com','www.B44sf.com','www.hunterspointshipyard.com','www.coirestaurant.com','www.womensbuilding.org','www.sftheaterfestival.org','www.alfredssteakhouse.com','www.williams-sonoma.com','www.iexpresssf.com','www.fogbeltstudio.com','www.cafedunord.com','www.victoriatheatre.org','www.sfopera.com','www.ploufsf.com','sfcentre.nearbynow.com','www.straybarsf.com','www.scomassausalito.com','www.hisfo.com','www.borobudursf.com','www.improv.org','www.jcccnc.org','portal.sre.gob.mx','www.palaceoffinearts.org','www.fillmorestreetsf.com','www.masasrestaurant.com','www.enricossf.com','www.smuinballet.org','www.jccsf.org','www.albonarestaurant.com','www.ybca.org','www.anchorandhopesf.com','www.odctheater.org','www.landmarktheaters.com','www.herchurch.org','www.trattoriapinocchio.com','www.queerculturalcenter.org','www.howweird.org','www.alamosquareseafoodgrill.com','www.cityarts.net','www.sfdph.org','www.momitobys.com','www.sundancesaloon.org','www.wholefoodsmarket.com','www.cellar360.com','www.presidiogolf.com','www.ristorantespecchio.com','www.folsomstreetfair.org','www.sweetwatersaloon.com','love.zinzanni.org','www.ssjeremiahobrien.org','www.terrasf.com','www.marintheatre.org','www.presidentscup.com','www.lolivier-restaurant.com','www.hornblower.com','www.staceys.com','www.longbarsf.com','www.sanmateoexpo.org','www.amber-india.com','www.adornabella.com','www.pastaparadiso.net','www.salsainthesquare.com','www.hiller.org','www.emeraldbowl.org','www.holarestaurant.com','www.bistroluneta.com','www.massake.com','www.barbambino.com','www.sfmarriott.com','www.sterngrove.org','www.sfmcd.org','www.hangarsteaksfo.com','www.garibaldisrestaurant.com','www.michaelmina.net','www.231ellsworth.com','www.beachchalet.com','www.sfjuneteenth.org','www.dailygrill.com','www.collegeofsanmateo.edu','www.barolopacifica.com','www.bouquetstoart.org','www.rnmrestaurant.com','www.sirfrancisdrake.com','www.bayviewoperahouse.org','www.yuzusf.com','www.1550hyde.com','www.uvaenoteca.com','www.folsomstreetfair.com','www.aziza-sf.com','www.lingba.com','www.orsonsf.com','www.thecjm.org','www.gotbubble.com','events.sfgate.com','www.artofthematter.org','www.marinesmemorialtheatre.com','www.poststreettheatre.com','www.zadinsf.com','www.home-sf.com','www.aquariumofthebay.com','www.axis-cafe.com','www.harrisrestaurant.com','www.flourandwater.com','www.cbiworld.org','www.mercedesrestaurant.com','www.ilunabasque.com','www.Bungalow44.com','www.sfelectricworks.com','www.spiedo.com','www.bixrestaurant.com','www.stepsofromecaffe.com','www.sanfranciscohyattregency.com','www.jazzheritagecenter.org','www.ferrybuildingmarketplace.com','www.anticasf.com','www.famsf.org','www.mintplazasf.org','www.pacificcatch.com','www.cioppinosonthewharf.com','www.tiburonchamber.org','www.parksconservancy.org','www.restaurantlulu.com','www.patagonia.com','www.latoscarestaurant.com','www.ruesaintjacques.com','www.cellspace.org','www.sfcolumbusday.org','www.city-sightseeing.us','www.presavi.com','sfyoshis2.inticketing.com','www.lecentralbistro.com','www.nectarwinelounge.com','www.turkeytrailtrot.com','www.bluemermaidsf.com','www.shopthefirm.com','www.abacussf.com','www.josephcozzasalon.com','www.aqua-sf.com','www.victorianalliance.org','www.artisanconfection.com','www.joedimaggiosrestaurant.com','www.therrazzroom.com','www.novabar.com','www.sfworldmusicfestival.org','www.refreshdayspa.com','www.frbsf.org','www.gambardellasrestaurant.com','www.barjohnny.com','www.palominosf.com','www.darkdining.com','www.rickshawstop.com','www.fortmason.org','www.nobhillgrille.com','www.unionsquaresf.net','www.lafolie.com','www.ilfornaio.com','www.fogharborfishhouse.com','www.grandpubahrestaurant.com','www.argonauthotel.com','www.piazzapellegrini.com','www.basilcanteen.com','www.cirquedusoleil.com','www.ristorantebrio.com','events.stanford.edu','www.cafearguellosf.com','disney.go.com','www.cowpalace.com','www.catchsf.com','www.thecanvasgallery.com','www.westbaysf.org','www.haightashburystreetfair.org','www.sfcenter.org','www.treasureislandfestival.com','www.bestofbroadway-sf.com','www.regalitosf.com','www.seejanerun.com','www.sfeagle.com','www.aureasf.com','www.wirtzgallery.com','www.artspan.org','www.freynorris.com','www.triptychsf.com','www.theintersection.org','www.attpark.com','www.brandyhos.com','www.sfmyconos.com','www.sanfranciscohiltonhotel.com','www.zazilrestaurant.com','www.RivaRestaurantLA.com','www.cafekati.com','www.mamacitasf.com','www.artaud.org','www.regencycentersf.com','www.utopiasalonsf.com','www.kinggeorge.com','www.somarts.org','www.pucciniandpinetti.com','www.tommytoys.com','www.ccsf.edu','www.hear-the-world.com','www.andronicos.com','www.thewarfieldtheatre.com','www.nps.gov','www.Eurekarestaurant.com','www.sfpride.org','www.tropisueno.com','www.xyz-sf.com','luisa.ypguides.net','www.fifthfloorrestaurant.com','www.LaTerrassePresidio.com','www.sfjapantown.org','www.zspace.org','www.presidio.gov','www.cathedralhillhotel.com','www.spasole.com','www.hoteltriton.com','www.clubhousecomedy.com','www.sfoarts.org','www.sushi-hunter.com','www.foreigncinema.com','www.winerycollective.com','www.saucesf.com','www.frascatisf.com','www.theindependentsf.com','www.sumisushisf.com','www.RoccosCafe.com','www.sfacgallery.org','www.farallones.org','www.crabhouse39.com','www.big4restaurant.com','www.noontimeconcerts.org','www.piqueos.com','www.sfiaf.org','www.theatrebayarea.org','www.flight001.com','www.DajaniGroup.net','www.maderasandhill.com','www.feminapotens.com','www.nccbf.org','www.truspa.com','www.carecensf.org','www.brickrestaurant.com','www.jdvhotels.com','www.badm.org','www.roysrestaurant.com','www.gostanford.com','www.nbjazzfest.com','www.pacificexpositions.com','www.elbo.com','www.bin38.com','www.stspeterpaul.san-francisco.ca.us','www.celebrationofcraftswomen.org','www.northbeachrestaurant.com','www.theregencyballroom.com','www.cuesa.org','www.stmarycathedralsf.org','www.cafemajesticsf.com','www.capellinis.com','www.cooleatz.com','www.sfsailtours.com','www.nctcsf.org','www.nettiescrabshack.com','www.dacor.com','www.bambinosristorante.com','www.sanfranciscomagicparlor.com','www.orpheum-theater.com','www.balboacafe.com','www.om28.com','www.bonardarestaurant.com','www.heavensdog.com','www.oola-sf.com','www.umamisf.com','www.saporeitaliano.org','www.creolabistro.com','www.aiasf.org','www.voicefactorysf.org','www.billgrahamcivic.com','www.missionculturalcenter.org','www.toronado.com','www.sporksf.com','www.duccasf.com','www.jeantyatjacks.com','www.tipiacera.com','www.lamplighters.org','www.bacarsf.com','www.shipyardartists.com','www.therhino.org','www.gumps.com','www.fleetfeetsanfrancisco.com','www.archipelagobistro.com','www.luellasf.com','www.castagnolas.com','www.kerouacalley.com','www.theatreofyugen.org','www.gaylords.com','www.thecottageeatery.com','www.sprucesf.com','www.nextstagedance.org','www.fringalesf.com','www.commonwealthclub.org','www.moscone.com','www.spn.usace.army.mil','www.kearnystreet.org','www.wonderlandshow.org','www.fareastcafesf.com','www.rainbow.coop','www.citylights.com','www.glbthistory.org','www.alembicbar.com','www.mercurysf.com','www.coolblackball.com','www.farinafoods.com','www.77maidenlane.com','www.cavwinebar.com','www.bebe.com','www.actioncamerasf.com','www.cclarkgallery.com','www.limon-sf.com','www.thechaya.com','www.piscosf.com','www.crystalfair.com','www.nobhillcafe.com','www.mxbuilding.com','www.abcseafoodrestaurant.com','www.koshercomedy.com','www.parks.sfgov.org','www.gitanerestaurant.com','www.meltingpot.com','www.onlyinsanfrancisco.com','www.ybgf.org','www.stanford.edu','www.westfield.com','www.42ndstmoon.org','www.quincerestaurant.com','www.kyo-ya-restaurant.com','www.act-sf.org','www.godemago.com','www.caffemacaroni.com','www.ci.sausalito.ca.us','www.marriott.com','houseofprimerib.ypguides.net','www.clubsix1.com','embassysuites1.hilton.com','www.sfhiphopdancefest.com','www.macys.com','www.aminermiracle.org','www.sfcablecar.com','www.sflyricopera.org','www.colibrimexicanbistro.com','www.traderjoes.com','www.wokwiz.com','www.peopleinplazas.org','www.thedaffodilrestaurant.com','www.slims-sf.com','www.sfindie.com','www.piazzadangelo.com','www.levistrauss.com','www.sanfranciscosoccer.org','www.positively6thstreetfair.org','www.threedegreesrestaurant.com','www.shopyandi.com','www.sfsymphony.org','www.villainssf.com','www.andalusf.com','www.giftcenterpavilion.com','www.jdvhospitality.com','www.chezspencer.net','www.biscuitsandblues.com','www.mythossancarlos.com','www.hotelnikkosf.com','www.hamon-washoku.com','www.greensrestaurant.com','www.grandsanfrancisco.hyatt.com','www.artworksf.com','www.two-sf.com','www.sfcomedyshow.com','www.anamandara.com','www.saintgregorys.com','www.chroniclebooks.com','www.galeriadelaraza.org','www.lastplanettheatre.com','www.dickensfair.com','www.cyc.org','www.foottours.com','sfpl.lib.ca.us','www.sfsu.edu','www.zoommultisports.com','www.stdominics.org','www.sfgirlschorus.org','www.citizencake.com','www.mezessf.com','www.landmarktheatres.com','www.pastapomodoro.com','www.cacciucco.net','www.menlopark.org','www.serpentinesf.com','www.caffesociale.com','www.friendssfpl.org','www.stepsofrometrattoria.com','www.LArdoiseSF.com','www.baykidsmuseum.org','www.111minnagallery.com','www.Porterhousesanmateo.com','www.sfzc.org','www.sfgmc.org','www.marketstreetassociation.org','www.urbantavernsf.com','www.theexit.org','www.2901broadwaystreet.com','www.sfsota.org','www.conservatoryofflowers.org','www.mangarosasf.com','www.opentable.com','www.thespinnaker.com','www.thickdescription.org','www.elpaseorestaurant.com','www.aifisf.com','www.chinatowncommunitydevelopmentcenter.org','www.thecannery.com','www.performances.org','www.barcrudo.com','www.rangesf.com','www.shadowlight.org','www.onemarket.com','www.cafeandree.com','www.parc55hotel.com','www.gatorsneosoul.com','www.markhopkins.net','www.kohsamuiandthemonkey.com','www1.macys.com','www.careme350.com','www.ruthschris.com','www.Sodinisbertoluccis.com','www.ymcasf.org','www.sfgov.org','www.tokyogogo.com','www.ramadaplazasf.com','www.supperclub.com','www.pescesf.com','www.sfmt.org','www.redandwhite.com','www.yoshis.com','www.boulevardrestaurant.com','www.copenhagenbakery.com','www.chinagrillmanagement.com','www.ziryabgrill.com','www.californiahistoricalsociety.org','www.ScheinAndSchein.com','ccva.stanford.edu','www.mh-a.com','www.lunaparksf.com','www.presidiosocialclub.com','www.livenation.com','www.internationalorange.com','www.WagyuA5.com','www.zincdetails.com','www.mariamariarestaurants.com','www.magictheatre.org','www.betelnutrestaurant.com','www.firstcrush.com','www.precitaeyes.org','www.jonsimsctr.org','www.harding-park.com','www.pier23cafe.com','www.modernmexican.com','www.1300fillmore.com','www.poggiotrattoria.com','www.istanbulsancarlos.com','www.himerestaurant.com','www.fishandfarmsf.com','www.sheltontheater.com','www.poesiasf.com','www.49ers.com','www.unionstreetpapery.com','www.pressclubsf.com','www.ristorante-portofino.com','www.anandafuara.com','www.gingkofurniture.com','www.maxfields-restaurant.com','www.azierestaurant.com','www.lacocinasf.org','www.bistrovidamp.com','www.fourseasr.com','www.sfmission.com','www.surlatable.com','www.bubblelounge.com','www.horatius.com','www.c-c-c.org','www.salthousesf.com','www.magnetsf.org','www.sfyc.org','www.sfpalace.com','www.stacksrestaurant.com','www.usfca.edu','www.dancemission.com','www.missionbeachcafesf.com','www.boudinbakery.com','www.centralparkbistro.com','www.marineclub.com','www.gordonbiersch.com','www.aquariusrecords.org','www.streetlightrecords.com','www.perryssf.com','sanfranciscoairport.hyatt.com','www.kabukisprings.com','www.lucewinerestaurant.com','www.qrestaurant.com','www.izzyssteaksandchops.com','www.thestinkingrose.com','www.lurerestaurant.com','www.caffebellavenezia.com','www.unionstreetsf.com','www.pier39.com','www.themossroom.com','www.raykophoto.com','www.decoratorshowcase.org','www.leftbank.com','www.southparkcafesf.com','www.zuppa-sf.com','www.zunicafe.com','www.jackfalstaff.com','www.kingfish.net','www.zareflytrap.com','www.blackangus.com','www.sozaisf.com','www.thelab.org','www.shoebizsf.com','www.ypt.org','www.solunasf.com','www.sfcvb.org','www.letseat.at','www.shnsf.com','www.elriosf.com','www.bdom.com','www.roccapulco.com','www.aaacc.org','www.bucadibeppo.com','www.piperade.com','www.bjesf.org','www.boboquivaris.com','cob.sfsu.edu','www.Troyasf.com','www.castafiorerestaurant.com','www.greenfestivals.org','www.gardencourt-restaurant.com','www.espetus.com','www.southfwb.com','www.goethe.de','www.staroftheseasf.com','www.soex.org','www.plumpjackcafe.com','www.labriciola-sf.com','www.farallonrestaurant.com','www.sfbaywhalewatching.com','www.indiaclayoven.com','www.act-sfbay.org','www.paulkrestaurant.com','www.farmerbrownsf.com','www.scalasbistro.com','www.sfcamerawork.org','www.rumisancarlos.com','www.chiaroscurosf.com','www.lecolonialsf.com','www.crushpadwine.com','www.bimbos365club.com','www.isarestaurant.com','www.ponzurestaurant.com','www.aquariumofthebay.org','www.millenniumrestaurant.com','www.sfmaverick.com','www.pescheria-sf.com','www.modernisminc.com','www.chakrasalonspa.com','www.embarcaderocenter.com','www.chanticleer.org','sanfrancisco.panpacific.com','www.tonyandtinasanfrancisco.com','www.mortons.com','www.castrotheatre.com','www.lascenecafesf.com','www.vietccsf.org','www.absinthe.com','www.rulli.com','www.chancellorhotel.com','www.infusionlounge.com','www.hayesvalleyshop.com','www.rosepistola.com','www.lemongrasssf.com','www.thebluemacawsf.com','www.magicfluteristorante.com','www.levendesf.com','www.newdelhirestaurant.com','www.cafemozartsf.com','www.johnsgrill.com','www.franciscancrabrestaurant.com','www.bayareacabaret.org','www.gracecathedral.org','www.destinosf.com','www.victorianwalk.com','www.nlfchildcare.org','www.acquerello.com','www.aliotos.com','www.projectsport.com','www.marketstreetgrillsf.com','www.thecastrotheatre.com','www.horizonsf.com','www.marqsinmenlo.com','www.cosmopolitansf.com','www.cafepescatore.com','www.pge.com','www.mindspring.com','www.garconsf.com','www.asiasf.com','www.qoolsf.com','www.linesballet.org','www.janetpomeroy.org','www.capanninasf.com','www.midisanfrancisco.com','www.theshermanrestaurant.com','www.oakcitybarandgrill.com','www.exploratorium.edu','www.westinstfrancis.com','www.142ThrockmortonTheatre.com','www.yorkhotel.com','www.zinniasf.com','www.imperialpalacesf.com','www.breezysf.com','www.zeum.org','www.zingari.com','www.pranasf.com','www.joeyandeddies.com','www.oldsaintmarys.org','www.stpatricksf.org','www.santorinisf.com','www.starwoodhotels.com','www.sanfranciscochinatown.com','www.kokkari.com','www.noodletheory.com','www.hornblowerholidays.com','www.thewarfieldtheatre.com','www.showboxonline.com','www.treasureislandfestival.com']
  378.